home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / m68k / 68343ffp.arc / FFPADD.SA < prev    next >
Text File  |  1989-08-30  |  9KB  |  213 lines

  1.        TTL     FAST FLOATING POINT ADD/SUBTRACT (FFPADD/FFPSUB)
  2. ***************************************
  3. * (C) COPYRIGHT 1980 BY MOTOROLA INC. *
  4. ***************************************
  5.  
  6. *************************************************************
  7. *                  FFPADD/FFPSUB                            *
  8. *             FAST FLOATING POINT ADD/SUBTRACT              *
  9. *                                                           *
  10. *  FFPADD/FFPSUB - FAST FLOATING POINT ADD AND SUBTRACT     *
  11. *                                                           *
  12. *  INPUT:                                                   *
  13. *      FFPADD                                               *
  14. *          D6 - FLOATING POINT ADDEND                       *
  15. *          D7 - FLOATING POINT ADDER                        *
  16. *      FFPSUB                                               *
  17. *          D6 - FLOATING POINT SUBTRAHEND                   *
  18. *          D7 - FLOATING POINT MINUEND                      *
  19. *                                                           *
  20. *  OUTPUT:                                                  *
  21. *          D7 - FLOATING POINT ADD RESULT                   *
  22. *                                                           *
  23. *  CONDITION CODES:                                         *
  24. *          N - RESULT IS NEGATIVE                           *
  25. *          Z - RESULT IS ZERO                               *
  26. *          V - OVERFLOW HAS OCCURED                         *
  27. *          C - UNDEFINED                                    *
  28. *          X - UNDEFINED                                    *
  29. *                                                           *
  30. *           REGISTERS D3 THRU D5 ARE VOLATILE               *
  31. *                                                           *
  32. *  CODE SIZE: 228 BYTES       STACK WORK AREA:  0 BYTES     *
  33. *                                                           *
  34. *  NOTES:                                                   *
  35. *    1) ADDEND/SUBTRAHEND UNALTERED (D6).                   *
  36. *    2) UNDERFLOW RETURNS ZERO AND IS UNFLAGGED.            *
  37. *    3) OVERFLOW RETURNS THE HIGHEST VALUE WITH THE         *
  38. *       CORRECT SIGN AND THE 'V' BIT SET IN THE CCR.        *
  39. *                                                           *
  40. *  TIME: (8 MHZ NO WAIT STATES ASSUMED)                     *
  41. *                                                           *
  42. *           COMPOSITE AVERAGE  20.625 MICROSECONDS          *
  43. *                                                           *
  44. *  ADD:         ARG1=0              7.75 MICROSECONDS       *
  45. *               ARG2=0              5.25 MICROSECONDS       *
  46. *                                                           *
  47. *          LIKE SIGNS  14.50 - 26.00  MICROSECONDS          *
  48. *                    AVERAGE   18.00  MICROSECONDS          *
  49. *         UNLIKE SIGNS 20.13 - 54.38  MICROCECONDS          *
  50. *                    AVERAGE   22.00  MICROSECONDS          *
  51. *                                                           *
  52. *  SUBTRACT:    ARG1=0              4.25 MICROSECONDS       *
  53. *               ARG2=0              9.88 MICROSECONDS       *
  54. *                                                           *
  55. *          LIKE SIGNS  15.75 - 27.25  MICROSECONDS          *
  56. *                    AVERAGE   19.25  MICROSECONDS          *
  57. *         UNLIKE SIGNS 21.38 - 55.63  MICROSECONDS          *
  58. *                    AVERAGE   23.25  MICROSECONDS          *
  59. *                                                           *
  60. *************************************************************
  61.          PAGE
  62. FFPADD IDNT    1,1  FFP ADD/SUBTRACT
  63.  
  64.        XDEF    FFPADD,FFPSUB   ENTRY POINTS
  65.        XREF    FFPCPYRT        COPYRIGHT NOTICE
  66.  
  67.          SECTION  9
  68.  
  69. ************************
  70. * SUBTRACT ENTRY POINT *
  71. ************************
  72. FFPSUB   MOVE.B  D6,D4    TEST ARG1
  73.          BEQ.S   FPART2   RETURN ARG2 IF ARG1 ZERO
  74.          EOR.B   #$80,D4  INVERT COPIED SIGN OF ARG1
  75.          BMI.S   FPAMI1   BRANCH ARG1 MINUS
  76. * + ARG1
  77.          MOVE.B  D7,D5    COPY AND TEST ARG2
  78.          BMI.S   FPAMS    BRANCH ARG2 MINUS
  79.          BNE.S   FPALS    BRANCH POSITIVE NOT ZERO
  80.          BRA.S   FPART1   RETURN ARG1 SINCE ARG2 IS ZERO
  81.  
  82. *******************
  83. * ADD ENTRY POINT *
  84. *******************
  85. FFPADD   MOVE.B  D6,D4    TEST ARGUMENT1
  86.          BMI.S   FPAMI1   BRANCH IF ARG1 MINUS
  87.          BEQ.S   FPART2   RETURN ARG2 IF ZERO
  88.  
  89. * + ARG1
  90.          MOVE.B  D7,D5    TEST ARGUMENT2
  91.          BMI.S   FPAMS    BRANCH IF MIXED SIGNS
  92.          BEQ.S   FPART1   ZERO SO RETURN ARGUMENT1
  93.  
  94. * +ARG1 +ARG2
  95. * -ARG1 -ARG2
  96. FPALS    SUB.B   D4,D5    TEST EXPONENT MAGNITUDES
  97.          BMI.S   FPA2LT   BRANCH ARG1 GREATER
  98.          MOVE.B  D7,D4    SETUP STRONGER S+EXP IN D4
  99.  
  100. * ARG1EXP <= ARG2EXP
  101.          CMP.B   #24,D5   OVERBEARING SIZE
  102.          BCC.S   FPART2   BRANCH YES, RETURN ARG2
  103.          MOVE.L  D6,D3    COPY ARG1
  104.          CLR.B   D3       CLEAN OFF SIGN+EXPONENT
  105.          LSR.L   D5,D3    SHIFT TO SAME MAGNITUDE
  106.          MOVE.B  #$80,D7  FORCE CARRY IF LSB-1 ON
  107.          ADD.L   D3,D7    ADD ARGUMENTS
  108.          BCS.S   FPA2GC   BRANCH IF CARRY PRODUCED
  109. FPARSR   MOVE.B  D4,D7    RESTORE SIGN/EXPONENT
  110.          RTS              RETURN TO CALLER
  111.  
  112. * ADD SAME SIGN OVERFLOW NORMALIZATION
  113. FPA2GC   ROXR.L  #1,D7    SHIFT CARRY BACK INTO RESULT
  114.          ADD.B   #1,D4    ADD ONE TO EXPONENT
  115.          BVS.S   FPA2OS   BRANCH OVERFLOW
  116.          BCC.S   FPARSR   BRANCH IF NO EXPONENT OVERFLOW
  117. FPA2OS   MOVEQ   #-1,D7   CREATE ALL ONES
  118.          SUB.B   #1,D4    BACK TO HIGHEST EXPONENT+SIGN
  119.          MOVE.B  D4,D7    REPLACE IN RESULT
  120. *        OR.B    #$02,CCR SHOW OVERFLOW OCCURRED
  121.          DC.L    $003C0002 ****ASSEMBLER ERROR****
  122.          RTS              RETURN TO CALLER
  123.  
  124. * RETURN ARGUMENT1
  125. FPART1   MOVE.L  D6,D7    MOVE IN AS RESULT
  126.          MOVE.B  D4,D7    MOVE IN PREPARED SIGN+EXPONENT
  127.          RTS              RETURN TO CALLER
  128.  
  129. * RETURN ARGUMENT2
  130. FPART2   TST.B   D7       TEST FOR RETURNED VALUE
  131.          RTS              RETURN TO CALLER
  132.  
  133. * -ARG1EXP > -ARG2EXP
  134. * +ARG1EXP > +ARG2EXP
  135. FPA2LT   CMP.B   #-24,D5  ? ARGUMENTS WITHIN RANGE
  136.          BLE.S   FPART1   NOPE, RETURN LARGER
  137.          NEG.B   D5       CHANGE DIFFERENCE TO POSITIVE
  138.          MOVE.L  D6,D3    SETUP LARGER VALUE
  139.          CLR.B   D7       CLEAN OFF SIGN+EXPONENT
  140.          LSR.L   D5,D7    SHIFT TO SAME MAGNITUDE
  141.          MOVE.B  #$80,D3  FORCE CARRY IF LSB-1 ON
  142.          ADD.L   D3,D7    ADD ARGUMENTS
  143.          BCS.S   FPA2GC   BRANCH IF CARRY PRODUCED
  144.          MOVE.B  D4,D7    RESTORE SIGN/EXPONENT
  145.          RTS              RETURN TO CALLER
  146.  
  147. * -ARG1
  148. FPAMI1   MOVE.B  D7,D5    TEST ARG2'S SIGN
  149.          BMI.S   FPALS    BRANCH FOR LIKE SIGNS
  150.          BEQ.S   FPART1   IF ZERO RETURN ARGUMENT1
  151.  
  152. * -ARG1 +ARG2
  153. * +ARG1 -ARG2
  154. FPAMS    MOVEQ   #-128,D3  CREATE A CARRY MASK ($80)
  155.          EOR.B   D3,D5    STRIP SIGN OFF ARG2 S+EXP COPY
  156.          SUB.B   D4,D5    COMPARE MAGNITUDES
  157.          BEQ.S   FPAEQ    BRANCH EQUAL MAGNITUDES
  158.          BMI.S   FPATLT   BRANCH IF ARG1 LARGER
  159. * ARG1 <= ARG2
  160.          CMP.B   #24,D5   COMPARE MAGNITUDE DIFFERENCE
  161.          BCC.S   FPART2   BRANCH ARG2 MUCH BIGGER
  162.          MOVE.B  D7,D4    ARG2 S+EXP DOMINATES
  163.          MOVE.B  D3,D7    SETUP CARRY ON ARG2
  164.          MOVE.L  D6,D3    COPY ARG1
  165. FPAMSS   CLR.B   D3       CLEAR EXTRANEOUS BITS
  166.          LSR.L   D5,D3    ADJUST FOR MAGNITUDE
  167.          SUB.L   D3,D7    SUBTRACT SMALLER FROM LARGER
  168.          BMI.S   FPARSR   RETURN FINAL RESULT IF NO OVERFLOW
  169.  
  170. * MIXED SIGNS NORMALIZE
  171. FPANOR   MOVE.B  D4,D5    SAVE CORRECT SIGN
  172. FPANRM   CLR.B   D7       CLEAR SUBTRACT RESIDUE
  173.          SUB.B   #1,D4    MAKE UP FOR FIRST SHIFT
  174.          CMP.L   #$00007FFF,D7 ? SMALL ENOUGH FOR SWAP
  175.          BHI.S   FPAXQN   BRANCH NOPE
  176.          SWAP.W  D7       SHIFT LEFT 16 BITS REAL FAST
  177.          SUB.B   #16,D4   MAKE UP FOR 16 BIT SHIFT
  178. FPAXQN   ADD.L   D7,D7    SHIFT UP ONE BIT
  179.          DBMI    D4,FPAXQN DECREMENT AND BRANCH IF POSITIVE
  180.          EOR.B   D4,D5    ? SAME SIGN
  181.          BMI.S   FPAZRO   BRANCH UNDERFLOW TO ZERO
  182.          MOVE.B  D4,D7    RESTORE SIGN/EXPONENT
  183.          BEQ.S   FPAZRO   RETURN ZERO IF EXPONENT UNDERFLOWED
  184.          RTS              RETURN TO CALLER
  185.  
  186. * EXPONENT UNDERFLOWED - RETURN ZERO
  187. FPAZRO   MOVEQ.L #0,D7    CREATE A TRUE ZERO
  188.          RTS              RETURN TO THE CALLER
  189.  
  190. * ARG1 > ARG2
  191. FPATLT   CMP.B   #-24,D5  ? ARG1 >> ARG2
  192.          BLE.S   FPART1   RETURN IT IF SO
  193.          NEG.B   D5       ABSOLUTIZE DIFFERENCE
  194.          MOVE.L  D7,D3    MOVE ARG2 AS LOWER VALUE
  195.          MOVE.L  D6,D7    SETUP ARG1 AS HIGH
  196.          MOVE.B  #$80,D7  SETUP ROUNDING BIT
  197.          BRA.S   FPAMSS   PERFORM THE ADDITION
  198.  
  199. * EQUAL MAGNITUDES
  200. FPAEQ    MOVE.B  D7,D5    SAVE ARG1 SIGN
  201.          EXG.L   D5,D4    SWAP ARG2 WITH ARG1 S+EXP
  202.          MOVE.B  D6,D7    INSURE SAME LOW BYTE
  203.          SUB.L   D6,D7    OBTAIN DIFFERENCE
  204.          BEQ.S   FPAZRO   RETURN ZERO IF IDENTICAL
  205.          BPL.S   FPANOR   BRANCH IF ARG2 BIGGER
  206.          NEG.L   D7       CORRECT DIFFERENCE TO POSITIVE
  207.          MOVE.B  D5,D4    USE ARG2'S SIGN+EXPONENT
  208.          BRA.S   FPANRM   AND GO NORMALIZE
  209.  
  210.  
  211.          END
  212.  
  213.